package com.dexter.year2024.cp1_linkedlist.level1_bronze;

/**
 * 【第一章-链表基础-青铜挑战-链表的构建与长度】
 * 备注：若非原题中出现“节点”，链表系列一律用“结点”表示，树单元则用“节点”
 */
public class InitLinkedList {

    /**
     * 链表结点 leetcode 创建法
     */
    public static class ListNode {
        public int val;
        public ListNode next;

        public ListNode(int x) {
            val = x;
            next = null;
        }
    }

    /**
     * 初始化链表
     *
     * @param array 根据数组创建链表
     * @return 创建完成后的头结点
     */
    public static ListNode initLinkedList(int[] array) {
        // 定义头结点和移动的当前结点
        ListNode head = null, cur = null;
        for (int i = 0; i < array.length; i++) {
            // 创建新结点
            ListNode newNode = new ListNode(array[i]);
            if (i == 0) {
                // 新结点是头结点
                head = newNode;
                cur = newNode;
            } else {
                // 新结点是当前结点的下一个
                cur.next = newNode;
                cur = newNode;
            }
        }
        // 创建完成，返回头结点
        return head;
    }

    /**
     * 获取链表长度
     *
     * @param head 从头结点开始遍历
     * @return 链表长度
     */
    public static int getListLength(ListNode head) {
        int length = 0;
        ListNode node = head;

        while (node != null) {
            length++;
            node = node.next;
        }
        return length;
    }

    /**
     * 打印链表
     *
     * @param head
     */
    public static void printLinkedList(ListNode head) {
        StringBuilder sb = new StringBuilder();
        while (head != null) {
            sb.append(head.val);
            if (head.next != null) {
                sb.append(",");
            }
            head = head.next;
        }
        System.out.println(sb.toString());
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        ListNode head = initLinkedList(array);
        System.out.println("链表长度：" + getListLength(head));
        printLinkedList(head);
    }
}
